package radarutil

import (
	"math"
)

const (
	earthRadius = 6371000 // 地球平均半径（米）
)

// RadarPosition 表示雷达的位置
type RadarPosition struct {
	Latitude  float64 // 纬度（度）
	Longitude float64 // 经度（度）
	Altitude  float64 // 高度（米）
}

// TargetInfo 表示雷达捕捉到的目标信息
type TargetInfo struct {
	Azimuth   float64 // 方位角（度）
	Elevation float64 // 俯仰角（度）
	Distance  float64 // 距离（米）
	Altitude  float64 // 相对于雷达的高度（米）
}

// TargetPosition 表示计算得到的目标位置
type TargetPosition struct {
	Latitude  float64 // 纬度（度）
	Longitude float64 // 经度（度）
	Altitude  float64 // 高度（米）
}

// 将度转换为弧度
func toRadians(degrees float64) float64 {
	return degrees * math.Pi / 180
}

// 将弧度转换为度
func toDegrees(radians float64) float64 {
	return radians * 180 / math.Pi
}

// CalculateTargetPosition 计算目标的位置
func CalculateTargetPosition(radar *RadarPosition, target *TargetInfo) *TargetPosition {
	// 将雷达的经纬度转换为弧度
	lat1 := toRadians(radar.Latitude)
	lon1 := toRadians(radar.Longitude)

	// 计算目标的地面距离
	groundDistance := target.Distance * math.Cos(toRadians(target.Elevation))

	// 计算方位角的弧度
	azimuth := toRadians(target.Azimuth)

	// 计算纬度差
	dLat := groundDistance * math.Cos(azimuth) / earthRadius

	// 计算经度差
	dLon := groundDistance * math.Sin(azimuth) / (earthRadius * math.Cos(lat1))

	// 计算目标的纬度和经度
	targetLat := lat1 + dLat
	targetLon := lon1 + dLon

	// 计算目标的高度
	targetAltitude := radar.Altitude + target.Altitude

	return &TargetPosition{
		Latitude:  toDegrees(targetLat),
		Longitude: toDegrees(targetLon),
		Altitude:  targetAltitude,
	}
}
